<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>从闭包和原型来看JS的本质</title>
  </head>
  <body>
    <!-- 
          JS和Java都为面向对象型的语言,但Java是一门完全面向对象的语言，并且Java的面向对象
          的基础是class，class在Java中不仅是对象的模板，更是一种天然的命名空间
          而JS中没有原生的命名空间，没有命名空间的话变量的定义就会产生问题，在JS中如果定义全局作用域的变量
          那么在任何位置都能修改，有安全隐患，如果定义成函数作用域的变量那么只能函数内部可见，
          所以一个很关键的问题就是
          *要定义在函数的内部又要能被外界以一定的方式进行访问
          *这时候就需要闭包，将变量定义嵌套函数的外层函数中，使用内层函数去访问它，再将内层函数return
          *这样外界就能使用内层函数的方式来访问外层函数的变量

          同理在定义构造函数的时候公共的方法和属性如果定义在构造函数内部的话，那么每一次创建对象都会调用一次
          浪费性能，如果在成员位置进行定义，再在构造函数内部进行访问的话又会污染全局作用域，因此要定义在原型中


          ?函数是JS的一等公民不仅可以封装对变量的操作还具有命名空间的作用

          *闭包是一种保护私有变量的机制，在函数执行时形成私有的作用域，保护里面的私有变量不受外界干扰。

          *直观的说就是形成一个不销毁的栈环境。
     -->
    <script></script>
  </body>
</html>
